package br.requisiteworks.modelo.service;

import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import br.requisiteworks.modelo.Funcionario;
import br.requisiteworks.modelo.dao.FuncionarioDao;
import br.requisiteworks.util.persistencia.ErroBancoDados;
import br.requisiteworks.util.persistencia.ResultadoVazio;

/**
 * Servico responsavel por executar as operacoes principais do modulo de
 * {@link Funcionario}s
 * 
 * @author Mikhail Domanoski
 * @version 1, 07/05/2010
 */
@Service
public class FuncionarioService {

	/**
	 * Log da classe
	 */
	private static final Log	log	= LogFactory.getLog(FuncionarioService.class);

	@Autowired
	private FuncionarioDao		funcionarioDao;

	/**
	 * Salva um novo {@link Funcionario} ao repositorio de dados
	 * 
	 * @param funcionario o {@link Funcionario} a ser adicionado ao repositorio
	 * @throws ErroBancoDados Caso ocorra algum erro durante a persistencia do
	 *             {@link Funcionario}
	 */
	public void salvarFuncionario(Funcionario funcionario) throws ErroBancoDados {
		this.funcionarioDao.insert(funcionario);
		log.info("Funcionario adicionado com sucesso: " + funcionario);
	}

	/**
	 * Atualiza um {@link Funcionario} existente no repositorio de dados
	 * 
	 * @param funcionario o {@link Funcionario} a ser atualizado
	 * @throws ErroBancoDados Caso ocorra algum erro durante a persistencia do
	 *             {@link Funcionario}
	 */
	public void atualizarFuncionario(Funcionario funcionario) throws ErroBancoDados {
		this.funcionarioDao.update(funcionario);
		log.info("Funcionario atualizado com sucesso: " + funcionario);
	}

	/**
	 * Busca no repositorio por todos os {@link Funcionario}s cadastrados no
	 * sistema
	 * 
	 * @throws ResultadoVazio Caso nenhum {@link Funcionario} seja encontrado
	 */
	public List<Funcionario> listarFuncionarios() throws ResultadoVazio {
		return this.funcionarioDao.select();
	}

	/**
	 * Busca no repositorio um {@link Funcionario} cujo numero seja igual ao
	 * parametro passado
	 * 
	 * @param numero O numero de identificacao do {@link Funcionario} no
	 *            repositorio de dados
	 * @throws ResultadoVazio Caso um {@link Funcionario} nao seja encontrado
	 */
	public Funcionario carregarFuncionario(int numero) throws ResultadoVazio {
		return this.funcionarioDao.select(numero);
	}

	/**
	 * Remove do repositorio o {@link Funcionario} passado pelo parametro
	 * 
	 * @param funcionario O {@link Funcionario} que sera removido do repositorio
	 *            de dados
	 * @throws ErroBancoDados Caso ocorra algum erro durante a transacao
	 */
	public void deletaFuncionario(Funcionario funcionario) throws ErroBancoDados {
		this.funcionarioDao.delete(funcionario);
		log.info("Funcionario apagado com sucesso: " + funcionario);
	}

	public List<Funcionario> procuraNome(String nome) throws ResultadoVazio {
		return this.funcionarioDao.select(nome);
	}
}
